//
//  ZFKFlowLayout.m
//  UI21_自定义的瀑布流
//
//  Created by SHG on 16/3/31.
//  Copyright © 2016年 apple. All rights reserved.
//

#import "ZFKFlowLayout.h"
#define WIDTH self.collectionView.frame.size.width
@interface ZFKFlowLayout ()

// 用来保存每一列的Y值
@property (nonatomic, retain)NSMutableDictionary *columnDic;
// 用来存放item的attribute对象
@property (nonatomic, retain)NSMutableArray *attributesArray;

@end

@implementation ZFKFlowLayout

#pragma mark 重写第一个方法: 初始化方法
- (instancetype)init {
    self = [super init];
    if (self) {
        self.columnDic = [NSMutableDictionary dictionary];
        self.attributesArray = [NSMutableArray array];
    }
    return self;
}

#pragma mark 第二个方法: 重写prepareLayout方法, 当collectionView布局item的时候, 该方法会被执行
- (void)prepareLayout {
    [super prepareLayout];
    
    // 根据列数进行遍历, 给起始的每列都加上上边界的距离
    for (NSInteger i = 0; i < self.columnCounts; i++) {
        NSString *key = [NSString stringWithFormat:@"%ld", i];
        self.columnDic[key] = @(self.edgeInsets.top);
    }
    // 获取collectionView上item的个数
    NSInteger count = [self.collectionView numberOfItemsInSection:0];
    // 循环遍历每个item
    for (int i = 0; i < count; i++) {
        [self setItemFrame:i];
    }
}

#pragma mark 第三个方法: 自定义一个方法设置每个item的信息
- (void)setItemFrame:(NSInteger)index {
    // 1. 首先获取当前最短的那一列
    // 2. 设置每个item的frame值
    
    // 初始化一个字符串, 用它来记录当前最短的列的下标
     __block NSString *minColumn = @"0";
    __block NSString *maxColumn = @"0";
    
    // 遍历字典的每个key和value
    [self.columnDic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        // 如果遍历得到的值小于默认列的值, 就将key的值赋值到minColumn里
        if ([obj floatValue] < [self.columnDic [minColumn] floatValue]) {
            minColumn = key;
        }
        
    }];
    
    [self.columnDic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        
        if ([obj floatValue] > [self.columnDic [maxColumn] floatValue]) {
            maxColumn = key;
        }
    }];
    
    // 宽 = (屏幕的宽 - 左边界 - 右边界- 列间距 * (列数 - 1 )) / 列数
    
    CGFloat width = (WIDTH - self.edgeInsets.left - self.edgeInsets.right - self.colunmSpace *(self.columnCounts - 1)) / self.columnCounts;
    
    // x = 左边距 + (宽 + 列间距) * 列的下标
    // 列的下标对应的是当前最短那列的下标
    CGFloat x = self.edgeInsets.left + (width + self.colunmSpace) * [minColumn floatValue];
    
    // 创建一个indexpath
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
    
    // 高
    CGFloat height = [self.delegate layout:self heightForItemAtIndexPath:indexPath width:width];
    
    // 先找到当前最短的那列的Y值
    CGFloat minY = [self.columnDic[minColumn] floatValue];
    
    // 为最短的列更新Y轴的高度 = minY + 高 + 行间距
    self.columnDic[minColumn] = @(minY + height + self.rowSpace);
    
    // 接下来这个类的作用是设置item的frame.bounds透明度等属性的
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    attributes.frame = CGRectMake(x, minY, width, height);
    [self.attributesArray addObject:attributes];
    
}

// 第四个方法: 把所有的样式返回, 告诉系统如何去布局item
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
    return self.attributesArray;
}

#pragma mark 第五个方法: 重新设置滚动的范围
- (CGSize)collectionViewContentSize {
    // 滚动范围以最长的列作为依据
    __block NSString *maxY = @"0";
    [self.columnDic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        if ([obj floatValue] > [self.columnDic [maxY] floatValue]) {
            maxY = key;
        }
        
    }];
    CGFloat h = [self.columnDic[maxY] floatValue] + self.edgeInsets.bottom;
    return CGSizeMake(0, h);
}



@end
